package com.edu.exam.entity.grading.audit;

import com.edu.exam.enums.grading.WorkflowStatus;
import com.edu.exam.enums.grading.WorkflowPriority;
import com.edu.exam.enums.grading.WorkflowType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 成绩审核工作流实体类
 *
 * <p>成绩审核工作流实体用于管理审核的工作流程，包含
 * 流程定义、流程实例、节点执行、状态跟踪等。确保审核流程的标准化和可控性。</p>
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_audit_workflow</p>
 *
 * <p>核心功能：
 * - 流程定义：管理审核流程的定义和配置
 * - 流程实例：创建和管理流程的执行实例
 * - 节点管理：管理工作流中的各个节点
 * - 状态跟踪：跟踪流程的执行状态
 * - 流程控制：控制流程的流转和分支</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeAuditWorkflow {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 工作流ID
     *
     * <p>工作流实例的唯一标识符。</p>
     */
    @Column(name = "workflow_id", nullable = false, length = 50, unique = true)
    private String workflowId;

    /**
     * 工作流定义ID
     *
     * <p>关联的工作流定义ID。</p>
     */
    @Column(name = "workflow_definition_id", nullable = false, length = 50)
    private String workflowDefinitionId;

    /**
     * 工作流名称
     *
     * <p>工作流的名称。</p>
     */
    @Column(name = "workflow_name", nullable = false, length = 200)
    private String workflowName;

    /**
     * 工作流版本
     *
     * <p>工作流的版本号。</p>
     */
    @Column(name = "workflow_version", length = 20)
    @Builder.Default
    private String workflowVersion = "1.0";

    /**
     * 工作流定义
     *
     * <p>工作流的完整定义，JSON格式存储。</p>
     */
    @Column(name = "workflow_definition", nullable = false, columnDefinition = "LONGTEXT")
    private String workflowDefinition;

    /**
     * 关联的审核任务ID
     *
     * <p>关联的审核任务ID。</p>
     */
    @Column(name = "audit_task_id")
    private Long auditTaskId;

    /**
     * 工作流状态
     *
     * <p>工作流的当前状态。
     * 支持的状态：CREATED（已创建）、RUNNING（运行中）、SUSPENDED（已暂停）、COMPLETED（已完成）、TERMINATED（已终止）、ERROR（错误）、CANCELLED（已取消）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "status", nullable = false, length = 20)
    @Builder.Default
    private WorkflowStatus status = WorkflowStatus.CREATED;

    /**
     * 当前节点ID
     *
     * <p>当前正在执行的节点ID。</p>
     */
    @Column(name = "current_node_id", length = 50)
    private String currentNodeId;

    /**
     * 当前节点名称
     *
     * <p>当前正在执行的节点名称。</p>
     */
    @Column(name = "current_node_name", length = 200)
    private String currentNodeName;

    /**
     * 发起人ID
     *
     * <p>工作流发起人的用户ID。</p>
     */
    @Column(name = "initiator_id", nullable = false, length = 50)
    private String initiatorId;

    /**
     * 发起人姓名
     *
     * <p>工作流发起人的姓名。</p>
     */
    @Column(name = "initiator_name", nullable = false, length = 100)
    private String initiatorName;

    /**
     * 开始时间
     *
     * <p>工作流开始执行的时间。</p>
     */
    @Column(name = "start_time")
    private LocalDateTime startTime;

    /**
     * 完成时间
     *
     * <p>工作流完成的时间。</p>
     */
    @Column(name = "complete_time")
    private LocalDateTime completeTime;

    /**
     * 预计完成时间
     *
     * <p>工作流的预计完成时间。</p>
     */
    @Column(name = "estimated_completion_time")
    private LocalDateTime estimatedCompletionTime;

    /**
     * 执行耗时
     *
     * <p>工作流执行的总耗时（分钟）。</p>
     */
    @Column(name = "execution_duration_minutes")
    private Integer executionDurationMinutes;

    /**
     * 超时时间
     *
     * <p>工作流的超时时间（分钟）。</p>
     */
    @Column(name = "timeout_minutes")
    private Integer timeoutMinutes;

    /**
     * 执行结果
     *
     * <p>工作流的最终执行结果。</p>
     */
    @Column(name = "execution_result", length = 20)
    private String executionResult;

    /**
     * 执行数据
     *
     * <p>工作流执行过程中的数据，JSON格式存储。</p>
     */
    @Column(name = "execution_data", columnDefinition = "LONGTEXT")
    private String executionData;

    /**
     * 流程变量
     *
     * <p>工作流执行过程中的变量，JSON格式存储。</p>
     */
    @Column(name = "process_variables", columnDefinition = "TEXT")
    private String processVariables;

    /**
     * 节点执行记录
     *
     * <p>各节点的执行记录，JSON格式存储。</p>
     */
    @Column(name = "node_execution_records", columnDefinition = "LONGTEXT")
    private String nodeExecutionRecords;

    /**
     * 错误信息
     *
     * <p>工作流执行过程中的错误信息。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 异常堆栈
     *
     * <p>工作流执行过程中的异常堆栈。</p>
     */
    @Column(name = "exception_stack", columnDefinition = "LONGTEXT")
    private String exceptionStack;

    /**
     * 重试次数
     *
     * <p>工作流执行失败的重试次数。</p>
     */
    @Column(name = "retry_count", nullable = false)
    @Builder.Default
    private Integer retryCount = 0;

    /**
     * 最大重试次数
     *
     * <p>允许的最大重试次数。</p>
     */
    @Column(name = "max_retry_count")
    @Builder.Default
    private Integer maxRetryCount = 3;

    /**
     * 工作流优先级
     *
     * <p>工作流的执行优先级。
     * 支持的级别：LOW（低）、NORMAL（普通）、HIGH（高）、URGENT（紧急）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "workflow_priority", length = 10)
    @Builder.Default
    private WorkflowPriority workflowPriority = WorkflowPriority.NORMAL;

    /**
     * 工作流类型
     *
     * <p>工作流的类型。
     * 支持的类型：SEQUENTIAL（顺序）、PARALLEL（并行）、CONDITIONAL（条件）、LOOP（循环）、SUBPROCESS（子流程）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "workflow_type", length = 20)
    @Builder.Default
    private WorkflowType workflowType = WorkflowType.SEQUENTIAL;

    /**
     * 工作流标签
     *
     * <p>JSON格式的工作流标签，用于分类和过滤。</p>
     */
    @Column(name = "workflow_tags", columnDefinition = "TEXT")
    private String workflowTags;

    /**
     * 工作流备注
     *
     * <p>工作流的备注信息。</p>
     */
    @Column(name = "workflow_notes", columnDefinition = "TEXT")
    private String workflowNotes;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建用户ID
     */
    @Column(name = "create_user_id", length = 50)
    private String createUserId;

    /**
     * 更新用户ID
     */
    @Column(name = "update_user_id", length = 50)
    private String updateUserId;

    /**
     * 版本号
     */
    @Column(name = "version", nullable = false)
    @Builder.Default
    private Integer version = 1;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    @Builder.Default
    private Boolean isDeleted = false;

    /**
     * 删除时间
     */
    @Column(name = "delete_time")
    private LocalDateTime deleteTime;

    /**
     * 删除用户ID
     */
    @Column(name = "delete_user_id", length = 50)
    private String deleteUserId;



}

